# hashlib模块
# 导入模块
import hashlib
import os
import random

# 第一种传入加密内容的方式 构造对象时传入
# 生成hash对象
# m1 = hashlib.md5('abc'.encode('utf8'))
# # 调用.hexdigest()生成哈希值
# print(m1.hexdigest())  # 900150983cd24fb0d6963f7d28e17f72
#
# # 第二种传入加密内容的方式 可以通过update多次传入
# m2 = hashlib.md5()
# m2.update('a'.encode('utf8'))
# m2.update('b'.encode('utf8'))
# m2.update('c'.encode('utf8'))
# print(m1.hexdigest())  # 900150983cd24fb0d6963f7d28e17f72

# # 普通加密
# # 用户注册
# username = 'jack'
# password = '123'
# # 数据库记录加密密码
# encryption_password = hashlib.md5(password.encode('utf8')).hexdigest()
#
# # 用户登录校验
# input_username = 'jack'
# input_password = '123'
# # 加密输入的密码
# encryption_input_password = hashlib.md5(input_password.encode('utf8')).hexdigest()
# # 数据库中找到 用户名 和 加密的密码 进行对比
# if input_username == username and encryption_input_password == encryption_input_password:
#     print('登陆成功')
# else:
#     print('用户名或密码错误')


# # 加密+加盐
# # 用户注册
# username = 'jack'
# password = '123'
# # 数据库记录加密密码
# # 加盐作为干扰项
# salt = 'hhhabc'
# # 加密输入的密码
# m = hashlib.md5(password.encode('utf8'))
# m.update(salt.encode('utf8'))
# encryption_password = m.hexdigest()
# print(encryption_password)
#
# # 用户登录校验
# input_username = 'jack'
# input_password = '123'
# # 后端拿到密码后也加盐进行hash计算
# m = hashlib.md5(input_password.encode('utf8'))
# m.update(salt.encode('utf8'))
# encryption_input_password = m.hexdigest()
# print(encryption_input_password)
#
# # 对用户密码加密
# # 数据库中找到 用户名 和 加密的密码 进行对比
# if input_username == username and encryption_input_password == encryption_password:
#     print('登陆成功')
# else:
#     print('用户名或密码错误')


# # 动态加盐
# username = 'jack'
# password = '123'
#
#
# def get_code(n):
#     code = ''
#     for i in range(n):
#         num = str(random.randint(0, 9))  # 0-9
#         upper = chr(random.randint(65, 90))  # A-Z
#         lower = chr(random.randint(97, 122))  # a-z
#         random_character = random.choice([num, lower, upper])
#         code += random_character
#     return code
#
#
# # 给密码拼接6位随机字符，增加干扰
# password += get_code(6)
# m = hashlib.md5(password.encode('utf8'))
# res = m.hexdigest()
# print(res)  # 216ff39e939637a5da0784a4b64d15f5

# # 文件完整性校验
# # 假设存在文件data.txt
#
# with open('data.txt', 'rb') as f:
#     m = hashlib.md5(f.read())  # 使用二进制格式打开文件，传入文件内容计算原文件hash值
# print(m.hexdigest())  # 876eb9aef0fc2a1a720748efa6f48154
# # 当下载文件时，计算下载文件的hash值与原文件hash值对比


# 文件完整性校验
# 假设存在大文件data.txt

file_size = os.path.getsize('data.txt')

if file_size > 10:  # 如果文件大于10字节，大小可以自己设定
    with open('data.txt', 'rb') as f:
        f.seek(0, 0)
        file_content_1 = f.read(2)  # 文件开头取2个字节

        f.seek(file_size // 2, 0)
        file_content_2 = f.readline()  # 文件1/2除取2个字节

        f.seek(file_size // 3, 0)
        file_content_3 = f.readline()  # 文件1/3除取2个字节

        f.seek(file_size // 4, 0)
        file_content_4 = f.readline()  # 文件1/4除取2个字节

        m = hashlib.md5(file_content_1)
        m.update(file_content_2)
        m.update(file_content_3)
        m.update(file_content_4)
        print(m.hexdigest())  # 将各个部分传入计算hash值 58a0314a1f03b90b54ec37768e3f060a
        # 当下载文件时，计算下载文件的hash值与原文件hash值对比
